package configs

import (
	"golang.org/x/crypto/bcrypt"
	"fmt"
	"os"
	"log"
	"regexp"
	"strings"
	"math/rand"
	"time"
	"path/filepath"
)

// 手机号验证（简化版）
func ValidatePhone(phone string) bool {
    return len(phone) == 11 && phone[0] == '1'
}

// 邮箱验证（RFC 5322标准）
func ValidateEmail(email string) bool {
    return regexp.MustCompile(`^[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$`).MatchString(strings.ToLower(email))
}

// 密码加密
func HashPassword(password string) (string, error) {
	hashedPassword, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
	if err != nil {
		return "", err
	}
	return string(hashedPassword), nil
}

//校验密码
func CheckPasswordHash(password, hash string) bool {
	return bcrypt.CompareHashAndPassword([]byte(hash), []byte(password)) == nil
}

// 判断字符串是否在数组中
func InArray(element string, slice []string) bool {
	for _, item := range slice {
		if item == element {
			return true
		}
	}
	return false
}

// 创建文件夹
func CreadDir(path string) {
    if !PathExists(path) {
        log.Println("创建文件夹", path)
        // 创建文件夹，如果目录不存在，递归创建
        if err := os.MkdirAll(path, os.ModePerm); err != nil {
            log.Fatalf("创建目录失败: %v", err)
        }
    }
}

// 判断文件夹是否存在
func PathExists(path string) bool {
    _, err := os.Stat(path)
    return !os.IsNotExist(err)
}

// 判断文件是否存在
func CheckFileIsExist(filename string) bool {
	var exist = true
	if _, err := os.Stat(filename); os.IsNotExist(err) {
		exist = false
	}
	return exist
}

// 删除指定目录下的所有文件
func DeleteFilesInDirectory(dir string) {
	files, err := filepath.Glob(filepath.Join(dir, "*"))
	if err != nil {
		fmt.Println("Error finding files:", err)
		return
	}
	for _, file := range files {
		err := os.Remove(file)
		if err != nil {
			fmt.Println("Error deleting file:", err)
		}
	}
}

// 生成随机字符串，用作redis key和文件名
func RandString(len int) string {
	r := rand.New(rand.NewSource(time.Now().UnixNano()))
	bytes := make([]byte, len)
	for i := 0; i < len; i++ {
		b := r.Intn(26) + 65
		bytes[i] = byte(b)
	}
	return string(bytes)
}